/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：登录通-数据源-数据持久层
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taiping.dlt.strategy.handler.elasticsearch;

import com.taiping.dlt.application.constant.dao.DataSourceEnum;
import com.taiping.dlt.dao.DataAccessObject;
import com.taiping.dlt.dataobject.AuthLoginDO;
import com.taiping.dlt.strategy.core.RepositoryHandler;
import com.taipingframework.boot.es.conditions.query.LambdaDeleteWrapper;
import com.taipingframework.boot.es.conditions.query.LambdaQueryWrapper;
import com.taipingframework.boot.es.toolkit.Wrappers;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * elasticsearch数据源 - 数据访问处理器 - 用户登录
 * <p>
 * 作为ReactiveElasticsearchTemplate的等效做法，可使用：
 * - ReactiveElasticsearchRepository
 * - SimpleReactiveElasticsearchRepository
 */
@Repository
@RepositoryHandler(DataSourceEnum.ELASTICSEARCH)
public class ElasticsearchAuthLoginHandler extends DataAccessObject<AuthLoginDO> {

    @Override
    public Flux<AuthLoginDO> queryForList(AuthLoginDO object) {
        LambdaQueryWrapper<AuthLoginDO> queryWrapper = Wrappers.<AuthLoginDO>lambdaQuery()
                .eq(AuthLoginDO::getLoginName, object.getAccountCode());
        return reactorElasticAccess.queryForList(queryWrapper);
    }

    @Override
    public Flux<AuthLoginDO> batchInsert(List<AuthLoginDO> recordList) {
        // 此处需要额外注意，如果Document文档的唯一标识(注解@Id标识的字段)已经存在，那么此处的保存实际上就是update操作
        return reactorElasticAccess.saveAll(recordList);
    }

    @Override
    public Mono<Boolean> batchDelete(List<String> objectIdList) {
        LambdaDeleteWrapper<AuthLoginDO> deleteWrapper = Wrappers.<AuthLoginDO>lambdaDelete()
                .in(AuthLoginDO::getLoginId, objectIdList);
        return reactorElasticAccess.deleteForList(deleteWrapper)
                .flatMap(deleteResult -> Mono.just(deleteResult > 0));
    }

}
